Java(trademark) is an object-orientated programming language developed by Sun Microsystems. The Java language is small, simple and portable across platforms and operating systems, both at the source and at the binary level. This makes the Java programming language very popular on the Internet.
Java""s platform independence and code compaction are the most significant advantages of Java over conventional programming languages. In conventional programming languages, the source code of a program is sent to a compiler which translates the program into machine code or processor instructions. The processor instructions are native to the system""s processor. If the code is compiled on an Intel-based system, the resulting program will only run on other Intel-based systems. If it is desired to run the program on another system, the user must go back to the original source code, obtain a compiler for the new processor, and recompile the program into the machine code specific to that other processor.
Java operates differently. The Java compiler takes a Java program and, instead of generating machine code for a particular processor, generates bytecodes. Bytecodes are instructions that look like machine code, but aren""t specific to any processor. To execute a Java program, a bytecode interpreter takes the Java bytecode converts them to equivalent native processor instructions and executes the Java program. The Java bytecode interpreter is one component of the Java Virtual Machine.
Having the Java programs in bytecode form means that instead of being specific to any one system, the programs can run on any platform and any operating system as long a Java Virtual Machine is available. This allows a binary bytecode file to be executable across platforms.
The disadvantage of using bytecodes is execution speed. System specific programs that run directly on the hardware from which they are compiled, run significantly faster that Java bytecodes, which must be processed by the Java Virtual Machine. The processor must both convert the Java bytecodes into native instructions in the Java Virtual Machine and execute the native instructions.
One way to speed up the Java Virtual Machine is by techniques such as the xe2x80x9cJust in Timexe2x80x9d (JIT) interpreter, and even faster interpreters known as xe2x80x9cHot Spot JITsxe2x80x9d interpreters. The JIT versions all result in a JIT compile overhead to generate native processor instructions. These JIT interpreters also result in additional memory overhead.
The slow execution speed of Java and overhead of JIT interpreters have made it difficult for consumer appliances requiring local-cost solutions with minimal memory usage and low energy consumption to run Java programs. The performance requirements for existing processors using the fastest JITs more than double to support running the Java Virtual Machine in software. The processor performance requirements could be met by employing superscalar processor architectures or by increasing the processor clock frequency. In both cases, the power requirements are dramatically increased. The memory bloat that results from JIT techniques, also goes against the consumer application requirements of low cost and low power.
The Java Virtual Machine has two options to support multi-threaded execution of Java programs: Native threads (one to one threads), which use the operating systems support for multi-threading, and Green threads (many to one threads) which are managed entirely within the Java Virtual Machine entirely outside the operating system purview. The implementation of Green threads is done in one of two ways; in the first a thread gets control of the Java Virtual Machine until it gives it up, this type of threading requires that all threads be xe2x80x9cwell behavedxe2x80x9d i.e. they give up control at various point in their execution if there is any other work waiting. The second approach lets each thread execute a number of bytecodes then the Java Virtual Machine switches to another thread if one is waiting, i.e. the thread doesn""t need to be xe2x80x9cwell behavedxe2x80x9d.
It is desired to have an improved system for implementing Java programs that provides a low-cost solution for running Java programs for consumer appliances.
The present invention comprises a thread lifetime unit in the hardware unit of a Java hardware accelerator system. The thread lifetime unit keeps track of when the current thread should halt processing in the system. Some implementation of green threads allocates to each thread a number of bytecodes to execute. The thread lifetime unit allows hardware unit to keep track of the number of bytecodes remaining in the active thread.
The present invention preferably uses a register to store the number of bytecodes to run for each thread. This value can be loaded into a counter which is decremented as instructions are issued. When the decrementing counter reaches zero or a negative value, the hardware accelerator passes control to the thread manager portion of Java Virtual Machine. In one preferred embodiment, the values in the CPU register file are cleared and written out to the memory. These include any operand stack values stored in the register file and the like. When the transfer of control is given to the Java Virtual Machine, the Java Virtual Machine is loaded into the CPU which loads into the system. In one embodiment, once the thread bytecode count reaches zero or below, the hardware accelerator implements microcode that causes the storing of the value stored in the CPU register file and the loading of the Java Virtual Machine.
In one embodiment, a single step-unit of the hardware unit allows for the production of debugger indications along bytecode boundaries. In one embodiment, a debugger indication, such as a soft interrupt, is produced after each group of register-based instruction(s) translated from a single bytecode. Instruction level parallelism is can be inhibited during single-step operations. Preferably, debugger indications are also inserted after a jump in the CPU program counter.